package uva.asimov.asimovtrainner;

import java.util.Calendar;

import android.app.Activity;
import android.app.DatePickerDialog;
import android.app.Dialog;
import android.content.Context;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationManager;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;

public class RegisterActivity extends Activity {

	private static final String ASIMOV = MainActivity.class.getSimpleName();
	private int nDay, nMonth, nYear;
	private DataBaseManager manager;
//	private Cursor cursor;
//	private SimpleCursorAdapter adapter;

	// Variables de los datos de la aplicacion
	private String tipo;
	private String descripcion;
	private String fecha;
	private String duracion;
	private String distancia;
	private String velocidad;
	private String otros;
	private String ubicacion;

	// declaracion de las variables que almacenarán los valores de los campos
	private Spinner txtTipo;
	private TextView txtDescripcion;
	private TextView txtFecha;
	private TextView txtDuracion;
	private TextView txtDistancia;
	private TextView txtVelocidad;
	private TextView txtOtros;
	// private TextView txtUbicacion;
	private Button btnAddLocation;
	private Button btnCleanData;
	private Button btnAddData;
	private LocationManager locationManager;

	static final int DATE_DIALOG_ID = 0;

	/**
	 * Método de creación de la actividad
	 */
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_register);

		manager = new DataBaseManager(this);

		txtFecha = (TextView) findViewById(R.id.txtFecha);
		// txtFecha.setText(actualizaFecha());
		fechaActual();
		txtFecha.setOnClickListener(new OnClickListener() {
			public void onClick(View view) {
				Log.d(ASIMOV, "<CLICK____________________CLICK");
				showDialog(DATE_DIALOG_ID);
			}
		});

		txtTipo = (Spinner) findViewById(R.id.desplegableDeportes);
		ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(
				this, R.array.sports_array,
				android.R.layout.simple_spinner_item);
		// Specify the layout to use when the list of choices appears
		adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
		// Apply the adapter to the spinner
		txtTipo.setAdapter(adapter);

		// Se extrae el tipo de deporte de la lista ofrecida
		txtTipo.setOnItemSelectedListener(new OnItemSelectedListener() {
			public void onItemSelected(AdapterView<?> parentView,
					View selectedItemView, int position, long id) {
				tipo = parentView.getItemAtPosition(position).toString();
			}

			public void onNothingSelected(AdapterView<?> parent) {
				// Another interface callback
			}

		}

		);

		btnAddData = (Button) findViewById(R.id.btnGuardar);
		btnAddData.setOnClickListener(new OnClickListener() {

			public void onClick(View view) {
				recogidaCampos();
			}
		});

		btnCleanData = (Button) findViewById(R.id.btnBorrarCampos);
		btnCleanData.setOnClickListener(new OnClickListener() {
			public void onClick(View view) {
				limpiarCampos();
			}
		});

		btnAddLocation = (Button) findViewById(R.id.btnUbicacion);
		btnAddLocation.setOnClickListener(new OnClickListener() {
			public void onClick(View view) {
				obtenerUbicacion();
			}
		});

		txtDescripcion = (EditText) findViewById(R.id.txtDescripcion);
		txtFecha = (TextView) findViewById(R.id.txtFecha);
		txtDuracion = (EditText) findViewById(R.id.txtDuracion);
		txtDistancia = (EditText) findViewById(R.id.txtDistancia);
		txtVelocidad = (EditText) findViewById(R.id.txtVelocidad);
		txtOtros = (EditText) findViewById(R.id.txtComentarios);
		locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.register, menu);
		return true;
	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		// Handle action bar item clicks here. The action bar will
		// automatically handle clicks on the Home/Up button, so long
		// as you specify a parent activity in AndroidManifest.xml.
		int id = item.getItemId();
		if (id == R.id.action_settings) {
			return true;
		}
		return super.onOptionsItemSelected(item);
	}

	/**
	 * Inicializa el campo fecha a la fecha actual
	 */
	protected void fechaActual() {
		final Calendar calendario = Calendar.getInstance();

		nYear = calendario.get(Calendar.YEAR);
		nMonth = calendario.get(Calendar.MONTH);
		nDay = calendario.get(Calendar.DAY_OF_MONTH);
		actualizaFecha(nDay, nMonth, nYear);

	}

	/**
	 * 
	 * Carga los valores de fecha pasados por parámetro en la vista
	 * 
	 * @param day
	 *            dia del mes
	 * @param month
	 *            mes del año
	 * @param year
	 *            año
	 */
	private void actualizaFecha(int day, int month, int year) {
		String fecha = String.valueOf(day) + "/" + String.valueOf(month + 1)
				+ "/" + String.valueOf(year);
		txtFecha.setText(fecha);

	}

	/**
	 * Lanza la pantalla de selección de fecha y actualiza con la selección
	 */
	private DatePickerDialog.OnDateSetListener mDateSetListener = new DatePickerDialog.OnDateSetListener() {

		@Override
		public void onDateSet(DatePicker view, int year, int monthOfYear,
				int dayOfMonth) {
			nYear = year;
			nMonth = monthOfYear;
			nDay = dayOfMonth;
			actualizaFecha(nDay, nMonth, nYear);

		}
	};

	protected Dialog onCreateDialog(int id) {

		switch (id) {
		case DATE_DIALOG_ID:
			return new DatePickerDialog(this, mDateSetListener, nYear, nMonth,
					nDay);
		}
		return null;
	}

	/**
	 * Recoge los valores introducidos en los campos correspondientes y los
	 * inserta en la base de datos
	 */
	protected void recogidaCampos() {

		// Recogida del campo tipo de entrenamiento

		// Comprobar campos obligatorios

		descripcion = txtDescripcion.getText().toString();
		fecha = txtFecha.getText().toString();
		duracion = txtDuracion.getText().toString();
		distancia = txtDistancia.getText().toString();
		velocidad = txtVelocidad.getText().toString();
		otros = txtOtros.getText().toString();

		// Se insertan los datos recogidos en la base de datos
		manager.insertar(tipo, descripcion, fecha, duracion, distancia,
				velocidad, otros, ubicacion);

		limpiarCampos();

	}

	/**
	 * Función encargada de obtener la ubicación, si es posible, desde el GPS o
	 * desde el proveedor en función de la precisión de cada uno de los medios
	 */
	protected void obtenerUbicacion() {

		try {
			Criteria criteria = new Criteria();
			criteria.setAccuracy(Criteria.ACCURACY_FINE);
			String loc = locationManager.getBestProvider(criteria, true);
			Location location = locationManager.getLastKnownLocation(loc);
			Log.d(ASIMOV, locationManager.getBestProvider(criteria, true));
			if (location == null)
				Log.d(ASIMOV, "NULL__________-------------");
			localiza(location);
			Log.d(ASIMOV, "Los dos activos");

		} catch (Exception e) {
			Toast.makeText(this, R.string.errorLocalizacion, Toast.LENGTH_SHORT)
					.show();
		}

	}

	/**
	 * Actualiza el valor de la ubicación con la ubicación actual
	 * 
	 * @param location
	 *            localización actual
	 */
	protected void localiza(Location location) {
		ubicacion = Double.toString(location.getLatitude()) + ";"
				+ Double.toString(location.getLongitude());
		Log.d(ASIMOV, ubicacion);
	}

	/**
	 * Limpia los campos de inserción en la vista. En el caso de la fecha
	 * actualiza a la actual.
	 */
	protected void limpiarCampos() {
		txtDescripcion.setText("");
		txtDuracion.setText("");
		txtDistancia.setText("");
		txtVelocidad.setText("");
		txtOtros.setText("");
		fechaActual();

	}

}
